﻿#ifndef __SS_NODE_H__
#define __SS_NODE_H__
#include "../ssObject.h"
#include "../element/ssTransform.h"
#include "../ss3dErrorDefine.h"
#include "container/ssList.h"


namespace StarSeeker
{

class ssNode : public ssObject
{
public:
	ssNode();
	ssNode(const char* name);
	virtual ~ssNode();
	//添加节点
	ssError AddChild(ssNode* pNode);
	//删除子节点,会释放内存
	ssError DelChild(ssNode* pNode);
	ssError DelChild(const char* name);
	//删除所有子节点
	void DelAllChild();
	//移除子节点,不会释放内存
	ssError RemoveChild(ssNode* pNode);
	//获取子节点
	ssNode* FindChild(const char* name);
	ssNode* FindChild(u32 offset);
	//获取所有子节点
	ssList<ssNode*>& GetChildren();
	//获取父节点
	ssNode* Parent();
	//更改父节点
	void SetParent(ssNode* pNode);
	//获取组件
	ssComponent* GetComponent(u32 type);
	template<typename T>
	T* GetComponent(u32 type)
	{
		if (type < ssComponent::SS_COMPONENT_MAX)
		{
			return SS_DYNAMIC_CAST(T*, m_components[type]);
		}
		return 0;
	}
	//添加组件
	ssError AddComponent(ssComponent* pComponent);
	//替换组件
	ssError ReplacComponent(ssComponent* pComponent);
	//删除组件,会释放内存
	bool DelComponent(ssComponent* pComponent);
	bool DelComponent(u32 type);
	//删除所有组件
	void DelAllComponents();
	//重置对象，对象池分配时用
	void Reset();
	//变换节点
	ssTransform& Transform();
protected:
	ssComponent*		m_components[ssComponent::SS_COMPONENT_MAX];//元素列表
	ssList<ssNode*>		m_children;//子节点
	ssNode*				m_pParent;//父节点
	ssTransform			m_transform;//变换元素可以直接取
};

}
#endif
